package com.atguigu.dao;

import com.atguigu.utils.JdbcUtils;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

//抽象类为了代码的复用
public abstract class BaseDao {

    /**
     * @Author 周轩霆
     * @Description 用于数据的增删改
     * @Date 14:31 2022/4/9
     * @Param
     * @return 如果返回-1则执行失败，返回其他表示影响的行数
     */
    private QueryRunner queryRunner = new QueryRunner();

    public int update(String sql, Object... args) {

        Connection connection = JdbcUtils.getCollection();
        try {
            return queryRunner.update(connection, sql, args);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(connection);
        }
        return -1;
    }

    /**
     * @return T
     * @Author 周轩霆
     * @Description 查询返回单个JavaBean的sql语句
     * @Date 14:39 2022/4/9
     * @Param type, 返回的对象类型
     * sql 执行的sql语句
     * args    sql对应的参数值
     **/

    public <T> T queryForOne(Class<T> type, String sql, Object... args) {
        Connection con = JdbcUtils.getCollection();
        try {
           return queryRunner.query(con, sql, new BeanHandler<>(type), args);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(con);
        }
        return null;
    }

    /**
     * @return T
     * @Author 周轩霆
     * @Description 查询返回多个JavaBean的sql语句
     * @Date 14:39 2022/4/9
     * @Param type, 返回的对象类型
     * sql 执行的sql语句
     * args    sql对应的参数值
     **/

    public <T> List<T> queryForList(Class<T> type, String sql, Object... args) {

        Connection con = JdbcUtils.getCollection();
        try {
           return queryRunner.query(con, sql, new BeanListHandler<>(type), args);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(con);
        }
        return null;
    }

    /**
     * @return java.lang.Object
     * @Author 周轩霆
     * @Description 执行返回一行一列的sql语句
     * @Date 15:01 2022/4/9
     * @Param [sql, args]
     */
    public Object queryForSingleValue(String sql, Object... args) {
        Connection con = JdbcUtils.getCollection();
        try {
           return queryRunner.query(con, sql, new ScalarHandler(), args);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JdbcUtils.close(con);
        }
        return null;
    }
}
